﻿// 803 最小距离和1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
#include <memory.h>

using namespace std;

/*
http://oj.daimayuan.top/course/7/problem/529


给你一棵 n
 个节点的树（节点的编号为 1
 到 n
），现在我们想从树中选出一个节点，使得这个节点到其它所有节点的距离之和最小，请问距离和最小是多少？

输入格式
第一行一个整数 n
 表示节点数。

接下来 n−1
 行，每行两个整数 x,y
 表示 x
 号节点和 y
 号节点之间有一条边。

输入保证是一棵树。

输出格式
输出一行一个数，表示最小距离和。

样例输入
4
1 2
1 3
3 4
样例输出
4
数据规模
对于所有数据，保证 1≤n≤1000,1≤x,y≤n
*/

int n, cnt,pre[10001], c[10001], q[10001], front = 1, rear = 0;
int dist[10001], f[10001];
vector<int> edges[10001];


void dfs(int x) {
	for (auto y : edges[x]) {
		if (y != pre[x]) {
			pre[y] = x;
			dist[y] = dist[x] + 1;
			dfs(y);
		}
	}
}

void solve(int  x) {
	++cnt;
	for (auto y : edges[x]) {
		if (y != pre[x]) {
			pre[y] = x;
			solve(y);
		}
	}
}


int main()
{
	scanf("%d", &n);
	for (int i = 1; i < n; i++) {
		int x, y;
		scanf("%d%d",&x,&y);
		edges[x].push_back(y);
		edges[y].push_back(x);
	}

	for (int i = 1; i <= n; i++) {
		f[i] = 0;
		memset(pre, 0, sizeof pre);
		for (auto y : edges[i]) {
			cnt = 0;
			pre[y] = i;
			solve(y);
			f[i] = max(f[i], cnt);
		}
	}

	int idx = 0, v = 1 << 30;
	for (int i = 1; i <= n; i++) {
		if (f[i] < v) {
			v = f[i];
			idx = i;
		}
	}

	memset(dist, 0, sizeof dist);
	memset(pre, 0, sizeof pre);
	pre[idx] = -1;
	dfs(idx);
	v = 0;
	int ans = 0;
	for (int i = 1; i <= n; i++)
		ans += dist[i];
	printf("%d\n",ans);
}

 